<template>
  <!-- 如果父组件上的属性，是直接应用到子组件的根标签上，可以不用设置 props 了-->
  <input
    type="text"
    class="myInput"
    :value="value"
    @input="handlerinput"
    :class="state"
    @blur="handlerchange"
  />
</template>

<script>
export default {
  // 自定义组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件
  // model: {
  //   prop: "value",
  //   event: "input",
  // },
  // 子组件定义props属性value()用于接收父组件传递的数据
  props: {
    value: String,
    //RegExp:正则表达式的类型
    rules: RegExp,
    msg: {
      type: String,
      default: "输入的数据不合法",
    },
  },
  data() {
    return {
      state: "",
    };
  },
  methods: {
    handlerinput(e) {
      //   console.log(e.target.value);
      this.$emit("input", e.target.value);
    },
    handlerchange(e) {
      const str = e.target.value.trim();
      // console.log(str);
      //如果输入为空,不校验
      if (str === "") {
        this.state = "";
        return;
      }
      //如果有规则
      if (this.rules) {
        // 正则对象.test(字符串)        可以用来校验数据
        if (this.rules.test(str)) {
          // console.log(this.rules, str, "校验通过");
          this.state = "success";
        } else {
          // console.log(this.rules, str, "校验失败", this.msg);
          this.$notify({ type: "warning", message: this.msg, duration: 1000 });
          this.state = "error";
        }
      }
    },
  },
};
</script>

<style lang="less" scoped>
.myInput {
  width: 318px;
  height: 46px;
  outline: none;
  border: none;
  border-bottom: 2px solid #ccc;
  font-size: 18px;
  line-height: 48px;
  display: block;
  margin: 0 auto;
  background-color: #f2f2f2;
}
.success {
  border-bottom-color: green;
  color: green;
}
.error {
  border-bottom-color: red;
  color: red;
}
</style>